package com.hw.job_3;

import java.io.*;
import java.nio.Buffer;

/**
 *   使用线程池将一个目录中的所有内容拷贝到另外一个目录中，包含子目录中的内容。
 * */
public class jobTest {

    public static void main(String[] args) {

        try {
            createFile();
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 复制
        try {
            copyDir("./job_3_dir", "./job_3_dir_copy");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 创建目录和文件
    public static void createFile() throws IOException {

        // 创建多级目录
        File dir = new File("./job_3_dir/dir_2/dir_3");
        if (!dir.exists()) {
            System.out.println("创建多级目录" + (dir.mkdirs() ? "成功 ": "失败"));
        }

        // 创建文件
        BufferedWriter bw = new BufferedWriter(new FileWriter("./job_3_dir/1.txt"));
        bw.write("根目录的文件内容");
        bw.close();

        bw = new BufferedWriter(new FileWriter("./job_3_dir/dir_2/2.txt"));
        bw.write("二级目录的文件内容");
        bw.close();

        bw = new BufferedWriter(new FileWriter("./job_3_dir/dir_2/dir_3/3.txt"));
        bw.write("三级目录的文件内容");
        bw.close();
    }

    // 复制文件目录（子目录以及文件）
    public static void copyDir(String src, String des) throws IOException {

        System.out.println("开始复制目录...，src = " + src + ", des = " + des);
        File srcFile = new File(src);
        File desFile = new File(des);
        if (!desFile.exists()) {
            desFile.mkdir();
            System.out.println("复制" + desFile.getName() + "目录成功");
        }

        // 遍历所有子目录，若是文件，则直接拷贝，若是目录，递归
        File[] files = srcFile.listFiles();
        for (File file: files) {
            if (file.isFile()) {
                copyFile(file.getAbsolutePath(), des + "/" + file.getName());
            }
            if (file.isDirectory()) {
                copyDir(file.getAbsolutePath(), (des + "/" + file.getName()));
            }
        }
    }

    // 复制文件内容
    public static void copyFile(String src, String des) throws IOException {

        System.out.println("开始复制文件...，src = " + src + ", des = " + des);
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(des));
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(src));
        byte[] bArr = new byte[1024];
        int res = 0;
        while((res = bis.read(bArr)) != -1) {
            bos.write(bArr, 0, res);
        }
        System.out.println("复制" + (new File(src)).getName() + "文件成功");
        bos.flush();
        bos.close();
        bis.close();
    }
}
